package com.itstyle.seckill.topic.jichu;

import java.util.ArrayDeque;
import java.util.Deque;
import java.util.Queue;
import java.util.concurrent.*;

/**
 * @Auther: liuwenxiang
 * @Date: 2020/3/15 21:02
 * @Description:
 */
public class TestQueue {


    public static void main(String[] args) {

        deque();
        queue();


    }



    public static void deque(){
        //---------------------------------------------------------------------------------------------
        Deque<String> deque =new ArrayDeque<>();
        //栈--先进后出
        //push添加   321
        deque.push("1"); deque.push("2"); deque.push("3");
        //poll取出并删除
        System.out.println(deque.pop()+"---"+deque.size());//pop取出
        System.out.println(deque.peek()+"---"+deque.size());//peek查询
        System.out.println(deque.poll()+"---"+deque.size());//poll取出
        System.out.println("--------------------------------");
        Deque<String> deque1 =new ArrayDeque<>();
        //队列--先进先出
        deque1.offer("1");deque1.offer("2");deque1.offer("3");
        System.out.println(deque1.pop()+"---"+deque1.size());//pop取出
        System.out.println(deque1.peek()+"---"+deque1.size());//peek查询
        System.out.println(deque1.poll()+"---"+deque1.size());//poll取出
        System.out.println("--------------------------------");
        //双端队列
        Deque<String> deque2 =new ArrayDeque<>(); // 3->2->1
        //offer添加
        deque2.offerFirst("1");deque2.offerFirst("2");deque2.offerFirst("3");
        //peek查询
        System.out.println(deque2.peekFirst());  System.out.println(deque2.peekLast());//peek查询
        //poll删除
        System.out.println(deque2.pollFirst());  System.out.println(deque2.pollLast());//poll取元素
        System.out.println(deque2.pollFirst());  System.out.println(deque2.pollLast());//peek，poll在集合为空时，返回null
        System.out.println(deque2.peekFirst());  System.out.println(deque2.peekLast());
        /**
         * Deque可以构建"队列"，"栈"两种数据结构：
         *  -- 数据结构是通过添加数据的命令决定，跟取数据的命令关系不大。
         *  -- push构建"栈"，offer构建"队列"，add构建集合。
         */

    }

    public static void queue(){
        //---------------------------------------------------------------------------------------------
        Queue<String> queue =new ArrayBlockingQueue<String>(10);
        /**
         * 大前提：都是阻塞操作，线程并发操作队列，会排队操作，因为操作队列元素，先要获取锁。
         *
         *
         * add--remove,offer--poll,put--take  peek查询
         * add 调用offer  添加元素到队列中，如果队列满了，继续插入元素会报错，IllegalStateException。
         *          -- 队列满，直接抛异常
         * offer    添加元素到队列，同时会返回元素是否插入成功的状态，如果成功则返回 true
         *         -- 队列满，不等待，直接返回结果
         *    offer(e,time,unit) -- 队列满，超时等待
         * put  队列满，阻塞等待(可以响应中断)   当阻塞队列满了以后，生产者继续通过 put添加元素，队列会一直阻塞生产者线程，直到队列可用
         *      -- 一直等待，直到队列可用
         *-------------------------------------------------------------------
         * remove
         * poll peek
         * take
         *
         * 阻塞队列：
         * ArrayBlockingQueue
         * LinkedBlockingQueue
         * PriorityBlockingQueue
         * DelayQueue
         * SynchronousQueue
         *
         */


        try {

            ((ArrayBlockingQueue<String>) queue).put("1"); ((ArrayBlockingQueue<String>) queue).put("2");
            System.out.println(queue.peek());
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

    }
}
